﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;

using EncryptionClassLibrary.Encryption;

namespace MakeIT.MiraPark.Negocios
{
    public static partial class ModelBO
    {

        public static string getParametro(string idParametro)
        {
            List<ParametroVO> listaParametroVO = getParametros(idParametro);
            if (listaParametroVO != null && listaParametroVO.Count > 0)
                return listaParametroVO[0].parametro;
            else
                return null;
        }

        public static List<ParametroVO> getParametros()
        {
            return getParametros(null);
        }

        public static List<ParametroVO> getParametros(string idParametro)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT IdParametro, Parametro, Criptografado");
            query.AppendLine("FROM parametro ");
            if (idParametro != null)
                query.AppendLine("WHERE IdParametro=?IdParametro ");
            query.AppendLine("ORDER BY IdParametro ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idParametro != null) cmd.Parameters.AddWithValue("?IdParametro", idParametro);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<ParametroVO> listParametro = new List<ParametroVO>();

                while (reader.Read())
                {
                    ParametroVO parametroVO = ParametroVO.CreateParametroVO();
                    parametroVO.idParametro = reader.GetString("IdParametro");
                    parametroVO.parametro = reader.GetString("Parametro");
                    parametroVO.criptografado = reader.GetBoolean("Criptografado");

                    listParametro.Add(parametroVO);
                }
                reader.Close();
                return listParametro;
            }
            catch (Exception ex){ throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static long setParametro(ParametroVO parametroVO)
        {
            return setParametro(parametroVO, null);
        }
        public static long setParametro(ParametroVO parametroVO, string whereValue)
        {
            StringBuilder query = new StringBuilder();

            if (parametroVO.criptografado)
                parametroVO.parametro = Encrypt(parametroVO.parametro);
            
            query.AppendLine("UPDATE parametro ");
            query.AppendLine("SET Parametro=?Parametro, Criptografado=?Criptografado ");
            query.AppendLine("WHERE IdParametro=?IdParametro ");
            if (whereValue != null)
                query.AppendLine(" AND Parametro=?whereValue ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdParametro", parametroVO.idParametro);
            cmd.Parameters.AddWithValue("?Parametro", parametroVO.parametro);
            cmd.Parameters.AddWithValue("?Criptografado", parametroVO.criptografado);
            if (whereValue != null) cmd.Parameters.AddWithValue("?whereValue", whereValue);

            try
            {
                cmd.Connection.Open();

                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static string newParametro(ParametroVO parametroVO)
        {
            StringBuilder query = new StringBuilder();

            if (parametroVO.criptografado)
                parametroVO.parametro = Encrypt(parametroVO.parametro);

            query.AppendLine("INSERT INTO parametro ");
            query.AppendLine("SET IdParametro=?IdParametro, Parametro=?Parametro, Criptografado=?Criptografado ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdParametro", parametroVO.idParametro);
            cmd.Parameters.AddWithValue("?Parametro", parametroVO.parametro);
            cmd.Parameters.AddWithValue("?Criptografado", parametroVO.criptografado);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
                return parametroVO.idParametro;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static void delParametro(ParametroVO parametroVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM parametro ");
            query.AppendLine("WHERE IdParametro=?IdParametro ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdParametro", parametroVO.idParametro);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static int getTicket()
        {
            int ticket = -1;
            
            ParametroVO parametroVO = ParametroVO.CreateParametroVO();
            parametroVO.idParametro = ParametroVO.parametros.ParametroLiberado;
            ParametroVO parametroVO2 = ParametroVO.CreateParametroVO();
            parametroVO2.idParametro = ParametroVO.parametros.Ticket;
            
            do
            {
                parametroVO.parametro = "N";
                
                bool parametroLiberado = false;
                for (int i = 0; i < 50; i++)
                {
                    if (setParametro(parametroVO, "S") > 0)
                    {
                        parametroLiberado = true;
                        break;
                    }
                }
                if (parametroLiberado)
                {
                    ticket = int.Parse(getParametro(ParametroVO.parametros.Ticket));
                    parametroVO2.parametro = (++ticket).ToString();
                    setParametro(parametroVO2);
                    parametroVO.parametro="S";
                    setParametro(parametroVO);
                }

            } while (ModelBO.getMovimentacao(ticket)!=null);
            return ticket;

        }

        public static string Encrypt(string phrase)
        {
            try
            {
                Symmetric sym = new Symmetric(Symmetric.Provider.Rijndael, true);
                Data key = new Data("Sapo cururu");
                Data encryptedData = new Data();

                encryptedData = sym.Encrypt(new Data(phrase), key);
                string base64EncryptedString = encryptedData.ToBase64();
                return base64EncryptedString;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static string Decrypt(string phrase)
        {

            try
            {
                Symmetric sym = new Symmetric(Symmetric.Provider.Rijndael, true);
                Data key = new Data("Sapo cururu");
                Data encryptedData = new Data();
                encryptedData.Base64 = phrase;
                Data decryptedData = new Data();
                decryptedData = sym.Decrypt(encryptedData, key);
                return decryptedData.ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    
    }
}
